package com.distribution.system.utils.http;

import org.apache.tomcat.util.http.fileupload.IOUtils;

import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.nio.charset.StandardCharsets;

/**
 * @author huoliping
 * @description 响应工具类
 * @date 2021-01-21 16:55
 **/
public class ResponseUtils {

    public static final String DOT = "\\.";

    /**
     * 通过 文件全路径名称 返回文件流
     *
     * @param fileNamePath 文件全路径名称
     * @return 返回文件流信息
     * @throws FileNotFoundException 抛出文件未找到异常
     */
    public static InputStream getFileInputStream(String fileNamePath) throws FileNotFoundException {
        File file = new File(fileNamePath);
        return new FileInputStream(file);
    }

    /**
     * 将文件流写回 ServletResponse  浏览器回自动解析文件类型并显示出来 （默认只可以显示（浏览）图片）
     *
     * @param response     写回文件流后的  ServletResponse
     * @param fileNamePath 文件名
     * @throws IOException 抛出文件未找到异常
     */
    public static void setStreamToResponse(HttpServletResponse response, String fileNamePath) throws IOException {
        if (FileType.FILE_TYPE_PDF.equals(fileNamePath.split(DOT)[1])) {
            response.setContentType("application/pdf");
        }
        IOUtils.copy(getFileInputStream(fileNamePath), response.getOutputStream());
    }

    /**
     * 将流写回浏览器 ，并指定为文件类型  访问后 在浏览器输入地址直接下载
     *
     * @param response     写回文件流后的  ServletResponse
     * @param fileNamePath 文件路径
     * @param fileName     在浏览器中显示下载 的文件名称
     * @throws IOException 抛出文件未找到异常
     */
    public static void setFileStreamToResponse(HttpServletResponse response, String fileNamePath, String fileName) throws IOException {
        response.reset();
        File file = new File(fileNamePath);
        // 设置response的Header
        response.addHeader("Content-Disposition", "attachment;filename=" + new String(fileName.getBytes(), StandardCharsets.ISO_8859_1));
        response.addHeader("Content-Length", "" + file.length());
        IOUtils.copy(getFileInputStream(fileNamePath), response.getOutputStream());
        //设置类型为文件流
        response.setContentType("application/octet-stream");
    }
}
